package com.damon.thread;

import java.net.Socket;
import java.net.SocketAddress;

import com.damon.Entity.WcsDvcEntity;
import com.damon.log.WcsLog;
import com.damon.utils.GlobalOjbectUtil;
import com.damon.utils.LogUtil;

/**
 * WARN:暂未启用，因为一个对象在被传递之后，重新用new赋值后，无法被回传。需要保存在公共类中。
 * ps：心跳线程，通过判断最后一次接受报文时间与当前时间的间隔来判断plc设备是否正常运作。 ps：plc设备每10秒发来一次心跳报文
 * ps：间隔时间超过30秒视为plc设备异常，开始重连
 * 
 * @author 风蚕
 *
 */
public class HeartbeatThread extends Thread {
	WcsDvcEntity wcsDvcEntity;// 设备信息
	Long lastMsgTime;// 最后一次接受报文时间
	Socket socket;
//	Boolean socketIsLive;//socket存活标志
	SocketAddress sd;
	
	String ip;
	int port;
	String dvcNo;

	WcsLog logger;

	public HeartbeatThread(WcsDvcEntity wcsDvcEntity, Long lastMsgTime, Socket socket,SocketAddress sd) {
		this.wcsDvcEntity = wcsDvcEntity;
		this.lastMsgTime = lastMsgTime;
		this.socket = socket;
//		this.socketIsLive = socketIsLive;
		this.sd = sd;
		
		this.ip = wcsDvcEntity.getDvcIp();
		this.port = Integer.valueOf(wcsDvcEntity.getPort());
		this.dvcNo = wcsDvcEntity.getDvcNo();

		this.logger = LogUtil.getLogger(HeartbeatThread.class, wcsDvcEntity);
	}

	@Override
	public void run() {
		/*
		 * ps：需要心跳重连的情况有两种 1、心跳超时，这时socket可能并未关闭
		 * 2、plc设备关闭，socket已关闭，SocketThread中已将socketIsLive=false
		 */
		while (true) {
			try {

				Thread.sleep(5000);
//				logger.info("socketislive1:"+socketIsLive);
				if (GlobalOjbectUtil.getSocketIsLive(wcsDvcEntity) == false) {
					if (socket.isClosed()==false) {
						socket.close();
					}
//					socket = new Socket(ip, port);
					socket.connect(sd);
					logger.info("cccccc心跳线程:"+socket.isClosed());
//					socketIsLive = true;
					GlobalOjbectUtil.addDvcNo(dvcNo);
					GlobalOjbectUtil.addSocketIsLive(wcsDvcEntity, true);
					
//					logger.info("socketislive2:"+socketIsLive);
					logger.info("重莲成功！");
				}
				long time = System.currentTimeMillis() - lastMsgTime;
				logger.info("检测心跳时间：" + time);
				if (time > 500 * 1000) {
					logger.info(ip + ":" + port + "心跳超时,开始重连！！");
//					socketIsLive = false;
					GlobalOjbectUtil.addSocketIsLive(wcsDvcEntity, false);
					if (!socket.isClosed()) {
						socket.close();
					}
					GlobalOjbectUtil.removeDvcNo(dvcNo);
					logger.info(ip + ":" + port + "端开！！！");
					socket = new Socket(ip, port);
//					socketIsLive = true;
					GlobalOjbectUtil.addSocketIsLive(wcsDvcEntity, true);
					GlobalOjbectUtil.addDvcNo(dvcNo);
					logger.info(ip + ":" + port + "重连成功！");
				}
			} catch (Exception e) {
				logger.error("重连失败，检查服务端。。。",e);
				e.printStackTrace();
			}

		}
	}
}
